package org.lanqiao.tjut.model;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.lanqiao.tjut.bean.TeaBean;
import org.lanqiao.tjut.db.DBDriverWithTransaction;
import org.lanqiao.tjut.db.DBFactory;
import org.lanqiao.tjut.db.DBSource;

public class TeaLoginModel {
	Scanner input = new Scanner(System.in);
	static int teaSel;
	/**
	 * 老师登录
	 */
	public  void TeaLoginMethod() {
		//输入老师的账号
		System.out.println("请输入教师的账号：");
		String number = input.next();
		//输入老师的密码
		System.out.println("请输入教师的秘密：");
		String password = input.next();
		//sql语句查询老师的账号和密码
		String strSql = "select * from tea where t_number=? and t_password=?";
		Object[] params = { number, password };
		List<TeaBean> lstTea = DBFactory.getDBDriverInstance().query(strSql, new BeanListHandler<>(TeaBean.class),
				params);
		//验证登陆账号和密码
		if (lstTea != null && lstTea.size() > 0) {
			System.out.println("恭喜你 登陆成功");
			// 若登录成功，则进行学生信息的相关管理
			while (true) {
				// 调用学生信息管理显示界面
				teaSel = showTGPerInf();
				switch (teaSel) {
				case 1:
					System.out.println("添加学生信息");
					// 调用添加学生信息方法
					ManStuInfModel add = new ManStuInfModel();
					add.addStuInf();
					break;
				case 2:
					System.out.println("查询学生信息");
					// 调用查询学生信息方法
					ManStuInfModel search = new ManStuInfModel();
					search.searchStuInf();
					break;
				case 3:
					System.out.println("修改学生信息");
					// 调用修改学生信息方法
					ManStuInfModel modify = new ManStuInfModel();
					modify.modifyStuInf();
					break;
				case 4:
					System.out.println("删除学生信息");
					// 调用删除学生学习方法
					ManStuInfModel delete = new ManStuInfModel();
					delete.deleteStuInf();
					break;
				case 5:
					System.out.println("保存学生信息");
					// 调用保存学生信息方法
					ManStuInfModel save = new ManStuInfModel();
					save.saveStuInf();
					break;
				case 6:
					System.out.println("退出系统！");
					break;
				default:
					System.out.println("输入错误只能输入（1、2、3、4、5、6）");
					break;

				}
			}
		} else {
			System.out.println("账号或密码输入错误 请重新输入");
		}

	}
	/**

	 * 基于jdbc的事务处理

	 * 

	 */

	public  void TeaLoginMethod2() {
		/*

		 * jdbc是的事务处理的流程：

		 * 获取connection对象：

		 * 打开事务：

		 *    // 设置connection对象的事务自动提交的属性为false

		 *    connection.setAuotCommit(fasle);

		 * 事务处理：

		 *    进行多表的事务处理；（进行多表数据库操作时要求全部使用设置了事务的connection对象）

		 * 进行提交或回滚：

		 *   // 提交事务

		 *   conn.commit();

		 *   // 回滚事务

		 *   conn.rollback();     

		 * 

		 */
		// 获取数据库连接对象

		Connection conn = null;
		try {
			// 获取数据库连接对象

			conn = DBSource.getDataSource().getConnection();
			// 打开事务：

			// 设置connection对象的事务自动提交的属性为false

			conn.setAutoCommit(false);
			// 开始多表的事务处理

			// 组织数据查询操作sql语句

			String strSql = "select count(*) teaCount from tea where t_number = ? and t_password = ?";
			// 查询语句的sql参数

			List<Object> lstParas = new ArrayList<>();
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
			System.out.println("请输入登录用户名：");
			String strUserName = br.readLine();
			// 添加参数

			lstParas.add(strUserName);
			System.out.println("请输入登录秘密：");
			String strUserPsw = br.readLine();
			lstParas.add(strUserPsw);
			// 调用db层执行sql语句

			Object objVal = DBFactory.getDBDriverInstance().query(conn, strSql, new ScalarHandler<Object>(),
					lstParas.toArray());
			// System.out.println("objVal:"+objVal);

			int i = Integer.parseInt(objVal.toString());
			// 判定是否登录成功

			if (i > 0) {
				System.out.println("登录成功：" + strUserName);
				// 若登录成功，则进行学生信息的相关管理
				while (true) {
					// 调用学生信息管理显示界面
					teaSel = showTGPerInf();
					switch (teaSel) {
					case 1:
						System.out.println("添加学生信息");
						// 调用添加学生信息方法
						ManStuInfModel add = new ManStuInfModel();
						add.addStuInf();
						break;
					case 2:
						System.out.println("查询学生信息");
						// 调用查询学生信息方法
						ManStuInfModel search = new ManStuInfModel();
						search.searchStuInf();
						break;
					case 3:
						System.out.println("修改学生信息");
						// 调用修改学生信息方法
						ManStuInfModel modify = new ManStuInfModel();
						modify.modifyStuInf();
						break;
					case 4:
						System.out.println("删除学生信息");
						// 调用删除学生学习方法
						ManStuInfModel delete = new ManStuInfModel();
						delete.deleteStuInf();
						break;
					case 5:
						System.out.println("保存学生信息");
						// 调用保存学生信息方法
						ManStuInfModel save = new ManStuInfModel();
						save.saveStuInf();
						break;
					case 6:
						System.out.println("退出系统！");
						break;
					default:
						System.out.println("输入错误只能输入（1、2、3、4、5、6）");
						break;

					}
				}
			} else {
				System.out.println("账号或密码输入错误 请重新输入");
			}
			
			// 事务处理1：修改admin的密码

			String strSqlModify = "update tea set t_password = ?";
			System.out.println("请输入修改的新密码：");
			String strNewUserPsw = br.readLine();
			int iupate = DBFactory.getDBDriverInstance().update(conn, strSqlModify, strNewUserPsw);
			// 验证当前操作已经完成

			// 组织数据查询操作sql语句

			String strSqlQuery = "select * from tea where t_number = 'admin'";
			TeaBean tbTeaB = DBFactory.getDBDriverInstance().query(conn, strSqlQuery, new BeanHandler<>(TeaBean.class));
			System.out.println("update操作之后，当前数据库中的记录内容："+tbTeaB.toString());
			// 事务处理2：添加一条新的数据记录

			String strSql2 = "INSERT INTO tea(t_number,t_password) VALUES ('admin2', '1234567')";
			int iInsert = DBFactory.getDBDriverInstance().update(conn, strSql2);
			// 根据业务逻辑判定事务处理是提交还是回滚

			// 事务提交或回滚处理

			if (iupate > 0 && iInsert > 0) {
				// 提交事务

				conn.commit();
			} else {
				// 回滚事务

				conn.rollback();
			}
		} catch (SQLException e) {
			// 发生异常，进行事务回滚

			// 回滚事务

			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block

				e1.printStackTrace();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block

			e.printStackTrace();
		}
		System.out.println("-------------------");

	}

	/**
	 * 老师管理学生信息
	 * 
	 * @return
	 */
	public  int showTGPerInf() {
		System.out.println("*******************************************");
		System.out.println("|            老师管理学生信息                                        |");
		System.out.println("********************************************");
		System.out.println("*      1、添加学生信息                                                           *");
		System.out.println("*      2、查询学生信息                                                           *");
		System.out.println("*      3、修改学生信息                                                           *");
		System.out.println("*      4、删除学生信息                                                           *");
		System.out.println("*      5、保存学生信息                                                           *");
		System.out.println("*      6、任意键退出                                                                 *");
		System.out.println("********************************************");
		teaSel = input.nextInt();
		return teaSel;

	}
	/**

	 * 基于jdbc的事务处理

	 * 

	 */
	public  void test06() {
		/*

		 * jdbc是的事务处理的流程：

		 * 获取connection对象：

		 * 打开事务：

		 *    // 设置connection对象的事务自动提交的属性为false

		 *    connection.setAuotCommit(fasle);

		 * 事务处理：

		 *    进行多表的事务处理；（进行多表数据库操作时要求全部使用设置了事务的connection对象）

		 * 进行提交或回滚：

		 *   // 提交事务

		 *   conn.commit();

		 *   // 回滚事务

		 *   conn.rollback(); 

		 * 

		 */
		// 获取事务处理驱动实体类对象(此步必须使用实例变量，因为后面的事务处理全部和该实例变量有关，保证后续的操作在同一个事务机制中)

		DBDriverWithTransaction dbdt = DBFactory.getDBDriverWithTransactionInstance();
		// 打开事务：

		dbdt.beginTransaction();
		// 开始多表的事务处理

		// 事务处理1：修改admin的密码

		String strSqlModify = "update tea set t_password = ? where t_id = ?";

		int iupate = dbdt.update(strSqlModify, "admin123", 2);
		// 验证当前操作已经完成

		// 组织数据查询操作sql语句

		String strSqlQuery = "select * from tea where t_number = 'admin'";
		TeaBean tbTeaB = dbdt.query(strSqlQuery, new BeanHandler<>(TeaBean.class));
		System.out.println("update操作之后，当前数据库中的记录内容：" + tbTeaB.toString());
		// 事务处理2：添加一条新的数据记录

		String strSql2 = "INSERT INTO TEA(T_NUMBER,T_PASSWORD) VALUES ( 'admin3','admin3')";
		int iInsert = dbdt.update(strSql2);
		// 根据业务逻辑判定事务处理是提交还是回滚

		// 事务提交或回滚处理

		if (iupate > 0 && iInsert > 0) {
			// 提交事务

			dbdt.commit();
		} else {
			// 回滚事务

			dbdt.rollback();
		}
		// 关闭资源

		dbdt.close();
		

	}

}
